package com.cskaoyan.javse.oop2._3review.stage2.model;

import com.cskaoyan.javse.oop2._3review.stage2.util.ScannerUtils;
import com.sun.corba.se.impl.oa.poa.POAPolicyMediatorImpl_NR_UDS;
import org.junit.Test;

/**
 * 用于存储学生对象数组，和对学生对象数组的增删改查
 *
 * @since 09:44
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class StudentList {
    /*
        需要一个学生对象的数组存储数据,数组中肯定存在一些null元素
        实际上这是很危险的,因为很容易导致空指针异常
     */
    private Student[] studs = new Student[3];

    {
        studs[0] = new Student(1, "张三", "男", 18, "Java37th", "13888886661");
        studs[1] = new Student(2, "李四", "女", 28, "Java37th", "13511112222");
        studs[2] = new Student(3, "王麻子", "男", 88, "C++", "18811112333");
    }

    /*
      为了避免出现空指针异常,我们需要过滤数组
      将数组中null的元素全部去掉,返回一个真实数据的数组
    */
    public Student[] getRealStuds() {
        /*
            怎么写呢?
            需求: 删除数组中的null元素
            1.先计数,求出新数组的长度
            2.遍历老数组,赋值
         */
        int count = 0;
        for (Student stud : studs) {
            if (stud != null) {
                count++;
            }
        }
        Student[] result = new Student[count];
        // 开始给新数组赋值
        int newArrIndex = 0;
        for (Student stud : studs) {
            if (stud != null) {
                result[newArrIndex] = stud;
                newArrIndex++;
            }
        }
        return result;
    }

    /**
     * 既然外界有检测唯一性的需求,那就提供该功能
     * 用于校验学号的唯一性
     * true表示不重复
     * false表示重复
     * @since 10:15
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     */
    public boolean judgeStuIdOnly(int stuId) {
        // 遍历数组,为了避免空指针异常,使用real方法获取没有null元素的对象数组
        for (Student stud : getRealStuds()) {
            if (stud.getStuId() == stuId) {
                // 表示重复
                return false;
            }
        }
        // 表示不重复
        return true;
    }

    /**
     * 将传入的学生对象,装进学生数组
     * 如果数组中还有null的位置,就可以插入成功true,如果满了,就会插入失败false
     * @since 10:48
     * @param stuInput 传入一个键盘录入的学生对象,是一个一定不为null的学生对象
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     */
    public boolean createStudent(Student stuInput) {
        /*
            怎么做?
            1.用哪个数组?
                用成员变量的数组,而不是real方法
            2.插入是怎么插入?
                数组不能真正插入元素,只能将null元素改成一个对象,这就算做一次赋值
         */

        // 遍历找到第一个为null的元素,修改它的值,完事
        for (int i = 0; i < studs.length; i++) {
            if (studs[i] == null) {
                studs[i] = stuInput;
                // 插入成功
                return true;
            }
        }
        // 插入失败,表示数组已经装满了
        return false;
    }

    /**
     * 直接遍历找,找到了返回学生对象
     * 没找到直接返回null
     * @since 11:05
     * @param targetId 键盘录入的学号
     * @return com.cskaoyan.javse.oop2._3review.stage2.model.Student
     * @author wuguidong@cskaoyan.onaliyun.com
     */
    public Student retrieveStudent(int targetId) {
        // 代码运行到这里,学号肯定存在,找到这个人就可以了
        for (Student stud : getRealStuds()) {
            if (stud.getStuId() == targetId) {
                return stud;
            }
        }
        return null;
    }

    /**
     * 直接遍历找 ,找到了就删除---> 将该位置的元素职位null,返回true
     * 如果没找到,说明没有该对象,返回false
     * @since 11:12
     * @param deleteId 传入的目标id
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     */
    public boolean deleteStudent(int deleteId) {
        for (int i = 0; i < studs.length; i++) {
            // 为了避免空指针异常,判断,如果是null,直接跳过
            if (studs[i] == null) {
                continue;
            }
            if (studs[i].getStuId() == deleteId) {
                studs[i] = null;
                // 删除成功
                return true;
            }
        }
        // 没找到
        return false;
    }

    /**
     * 遍历数组,找到目标id对应的对象,然后用新的学生对象替换它
     * 成功返回true 失败返回false
     * @since 11:31
     * @param updateId 目标id,而且它一定对应一个对象,不可能不存在
     * @param stuUpdate 更新的学生对象,一定不是null
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     */
    public boolean updateStudent(int updateId, Student stuUpdate) {
        for (int i = 0; i < studs.length; i++) {
            // 为了避免空指针异常,需要将null元素跳过
            if (studs[i] == null){
                continue;
            }
            if (studs[i].getStuId() == updateId){
                // 找到了,直接替代
                studs[i] = stuUpdate;
                return true;
            }
        }
        return false;
    }
}